package com.ruoyi.act.module.service;

import com.github.pagehelper.PageInfo;
import com.ruoyi.act.module.domain.ActDeploy;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
import java.util.List;

/**
 * 流程管理接口
 *
 * @author hcj
 */
public interface IDeployService {

    /**
     * 分页查询部署的流程实例
     * @param deploy
     * @return
     */
    PageInfo<Deployment> findPage(ActDeploy deploy);

    /**
     * 根据modelId查询Model信息并部署流程
     *
     * @param modelId
     * @return
     */
    Deployment createDeploymentByModel(String modelId) throws IOException;

    /**
     * 部署流程
     *
     * @param filePath
     * @param name
     * @return
     * @throws FileNotFoundException
     */
    Deployment createDeployment(String filePath, String name) throws FileNotFoundException;

    /**
     * 查询流程列表
     *
     * @param processKey
     * @return
     */
    List<ProcessDefinition> createProcessDefinitionQuery(String processKey);

    /**
     * 删除给定的部署并进行级联删除以处理流程实例，历史流程实例和作业。
     * 参数：
     * deploymentId –部署的ID，不能为nul
     *
     * @param deploy
     */
    void deleteDeployment(ActDeploy deploy);

    /**
     * 用给定的ID挂起流程定义。 如果流程定义处于暂停状态，则将无法基于流程定义启动新流程实例。 注意：流程定义的所有流程实例仍将处于活动状态（即未挂起）！
     * 抛出：
     * ActivitiObjectNotFoundException –如果找不到这样的processDefinition
     * ActivitiException-如果流程定义已经处于挂起状态。
     */
    void suspendProcessDefinitionById(String processDefinitionId);

    /**
     * 挂起流程
     *
     * @param suspendProcessInstances true 表示会暂停所有流程实例
     * @param suspensionDate          流程定义将被暂停的日期 如果为null，则立即暂停过程定义。 注意：作业执行者必须处于活动状态才能使用它！
     */
    void suspendProcessDefinitionById(String processDefinitionId, Boolean suspendProcessInstances, Date suspensionDate);

}
